triosim 模拟器 (一)

1. 互斥锁 std::mutex

特点:同一时间只允许一个线程访问资源

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;
int counter = 0;

void add() {
    // 其他线程仍然可以调用 add 函数,但如果函数里也要锁同一个 smtx,就会在加锁那一行等待
    std::lock_guard<std::mutex> lock(mtx); // 自动加锁,离开作用域自动解锁
    counter++;
}

int main() {
    std::thread t1(add);    // 创建一个线程对象 r1,并让新线程执行函数 add
    std::thread t2(add);

    t1.join();              // 当前线程等待 t1 这个线程执行完
    t2.join();

    std::cout << counter << "\n";
}

常用写法:

std::lock_guard<std::mutex> lock(mtx);

2. 共享锁 std::shared_mutex

特点:

  • 多个线程可以同时读
  • 写线程需要独占访问
  • 适合“读多写少”

需要 C++17:

#include <iostream>
#include <thread>
#include <shared_mutex>
#include <vector>

std::shared_mutex smtx;
int data = 0;

// 读:共享锁,多个线程可同时进入
void read_data() {
    std::shared_lock<std::shared_mutex> lock(smtx);
    std::cout << data << "\n";
}

// 写:独占锁,只能一个线程进入
void write_data() {
    std::unique_lock<std::shared_mutex> lock(smtx);
    data++;
}

int main() {
    std::thread r1(read_data);
    std::thread r2(read_data);
    std::thread w1(write_data);

    r1.join();
    r2.join();
    w1.join();
}

3. 简单对比

类型 用法 效果
std::mutex std::lock_guard<std::mutex> 读写都互斥
std::shared_mutex std::shared_lock 多个读可同时进行
std::shared_mutex std::unique_lock 写独占

评论